查看原文
其他

NCL画图个例

首先呢,给大家推荐一个视频:童鞋们熟悉机器学习算法以及最新的深度神经网络吗??? 

扫描此二维码即可领取

Example 1——XY plots

这个例子介绍了 NCL 的基础知识,例如如何开始和结束 NCL 脚本,如何创建和初始化变量,如何创建和绘制 XY 坐标图,以及如何设置 resources 来改变XY 坐标图的外观。此外还介绍了 NCL 变量包含元数据的概念,以及展示了如何从 ASCII 文件读取数据。

     这个例子创建了 5 个 XY 坐标图。前四个图使用了 NCL 脚本生成的数据,第五个图读取了 ASCII 文件的数据。

      第一个图有一个曲线,其他图右多条曲线。每个图相对前一个图来讲都有一些改动的地方,例如添加标题、线标签,改变线条颜色和粗细,添加标记。在以后的例子中将有更加复杂的 XY 坐标图。请注意,“line”和“curve”在这个示例中互换使用,用来表示 XY 坐标图的曲线。

      分号“;”在 NCL 脚本中表示允许注释。所有的注释都必须以分号开头,任何在分号之后和下一个换行符前的东西都将忽略。注释可以在一行中单独出现,也可以出现在 NCL 命令之后。但是在同一行注释不能出现在命令之前,因为注释符之后所有的东西都被忽略。

    运行这个示例,必须下载以下文件:gsun01n.ncl,然后键入:ncl gsun01n.ncl

示例 1 代码及解释

1. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" ; Load the NCL file that contains the gsn_* 

载入本示例使用的包含函数和程序(以 gsn 开头的)的 NCL 脚本。NCL load 语句的作用和 C Fortran90 程序中 include 作用一样。

2.; functions used below.

3. begin

每个 NCL 脚本都以 begin 声明开始,以 end 声明结束。

4. x = new(9,float) ; Define two 1D arrays of 9 elements each.

5. y = new(9,float)

new 语句来声明 2 个各有 9 个元素的 1 维浮点数组。new 语句的第一个参数表明变量的维度,第二个参数表明类型。在这里,这两个 new 语句是多余的,

因为在 NCL 中你可以通过初始化它们来声明变量(就如下两行所示)。所有有关 NCL 变量类型的内容,请参见 NCL Reference 的“NCL data types overview

6.

7.x = (/10.,20.,30.,40.,50.,60.,70.,80.,90./)

8. y = (/0.,0.71,1.,0.7,0.002,-0.71,-1.,-0.71,-0.003/)

为刚声明的两个 1 维数组赋值。在赋值语句中,在以逗号分隔开的数组值之前是“/”,以“/”结束。NCL 的数组是仿照 C 程序语言中的数组,也就是它们都是 row-major,而且从 0 开始(Fortran 中是 column-major,并且从 1 开始)。 

9.

10. wks = gsn_open_wks("x11","gsun01n") ; Open an X11 workstation.

NCL 生成图形,就需要告诉它哪里绘制图形。选择也就是熟知的工作站,是一个 X11 窗口,一个 NCAR 图形图元文件(NCGM),或者是 PostScript 文件(正常、包覆或者包覆交换 regularencapsulated or encapsulated interchange)。gsn_open_wks 函数打开上述类型的一个工作站,因此才可以在上面画图。第一个参数(一个字符串),表示你想要绘制的图形在哪儿输出(“X11”是 X11窗口,“ngcm”是 NCGM,“ps”是“eps”或者“epsi”是 PsotScript 文件)。第二个参数(也是一个字符串)决定了输出图像的名字(name.ncgm NCGM 件,name.{ps,eps,epsi}PsotScript 文件,name 就是输入的第二个参数。第二个参数还有其他作用,将在例 8 和例 9 中讨论。gsn_open_wks 返回的值是图形类型的特殊变量,这个 NCL 的变量类型来决定图形对象。

11

12. plot = gsn_xy(wks,x,y,False) ; Draw an XY plot with 1 curve.

gsn_xy 函数用来创建并绘制 XY 坐标图,并且以 XY 坐标图图形类型变量作为返回值(大多数情况下,可以不需要理会这个返回值)。第一个参数是你想要绘制 XY 坐标图的工作站(从上次调用 gsn_open_wks 的返回的变量)。接下来的两个参数是想要绘制的包括 XY 数组的变量。这两个参数可以是 floatdoubleinteger 类型,可以是一维或者多维(下面会解释)。最后一个参数是一个逻辑值,表明是否设置任何“resources”来改变坐标图外观。要得到 NCL 提供的默认的 XY 坐标图,将最后一个参数留为 False(在 NCL 中,逻辑值设为特殊关键字,True 或者 False,开头字母必须大写)。gsn_xy 函数绘制带有刻度标记的 XY 坐标图。对于默认的 XY 图,并没有提供标题或者 X/Y 轴标签,但是这些都可以很容易地添加,正如下面几个图所示。你还可以改变刻度的格式,如例 7 所示。默认情况下,当坐标图绘制到 X11 窗口或者 NCGM 文件,有一个黑色的背景和白色的前景。如果是绘制到 PostScript 文件,是白色的背景和黑色的前景。在后面的实例中,可以学到如何来设置背景和前景的颜色。当这样做的时候,无论在什么工作站绘制,图都有一样的颜色。一旦你打开了 X11 类型的工作站,gsn_xy 函数就产生一个 X11 窗口,你需要点击鼠标左键前进到下一帧。

13.

14. ;----------- Begin second plot -----------------------------------------

在代码中分开,来表示进入第二个图的代码。绘制带有三条曲线的 XY 坐标图,每条曲线有 9 个点。

15.

16. y2 = (/(/0., 0.7, 1., 0.7, 0., -0.7, -1., -0.7, 0./),\

17. (/2., 2.7, 3., 2.7, 2., 1.3, 1., 1.3, 2./),\

18. (/4., 4.7, 5., 4.7, 4., 3.3, 3., 3.3, 4./)/)

定义了一个 3×9 的数组(第一维表示曲线的数目,第二维表示点的数目)。注意到此时并没有使用 new 来声明这个数组,因为在 NCL 可以通过赋值来创造变量。NCL 能够通过初始化来决定一个变量的维度和类型。例如,创建一个叫做 i 2×3×4 的整型数组,其每个值都设为 0,可以使用如下 NCL 语句:i = (/ (/ (/0,0,0,0/), (/0,0,0,0/), (/0,0,0,0/) /),\(/ (/0,0,0,0/), (/0,0,0,0/), (/0,0,0,0/) /) /)以上的也可以用下面的两行来完成:i = new((/2,3,4/),integer)i = 0NCL 中的“\”用来表示行连续符。

19.

20. x@long_name = "X" ; Define attributes of x

21. y2@long_name = "Y" ; and y2.

NCL 变量比传统程序语言如 C Fortran 中使用的变量更一般。通常,他们包含值,但它们也可能包含这个变量的辅助信息。这种额外的信息通常被称为“元数据”。元数据被分成三种类型:属性、命名的维和坐标变量(attributesnamed dimensions coordinate variables)。可以给变量分配无限量的属性数目,每个分配给变量的属性都会使用“@符号。

20-21 行,对 x y2 变量都创建了叫做“long_name”的属性。更多的NCL 变量属性的信息,请参阅“Basics”中的“Variable”一节。默认情况下,无论是 X 或者 Y 数据数组设置了名叫“long_name”的属性(在netCDF 文件中通常如此),那么 gsn_xy 会用这个属性在 XY 坐标图中作为 X / Y 轴的标签(除非你通过设置 resources 来覆盖,如下面所示)。

23. plot = gsn_xy(wks,x,y2,False) ; Draw an XY plot with 3 curves.

绘制一个新的坐标图,使用与第一个图形相同的 X 数组,和刚定义的新的y2 数组。因为 X 只是一个一维的数组,NCL x 数组的值和 y2 数组中三条曲线的值进行配对。如果在 3×9 Y 数组以外还声明了一个 3×9 X 数组,那Y 数组中的每个值都会和相对应的 X 数组的每个值对应。请注意,如果是在一个 XY 坐标图中绘制超过一条曲线的话,那么 gsn_xy会用独特的虚线类型来绘制每条曲线。共有 16 种不同的虚线类型,在图形文件中查看“dash patterns”列表。注意到由于属性“long_name”而出现的新的 X Y 轴标签。

24.

25. ;----------- Begin third plot -----------------------------------------

画出相同的三条曲线,但每条曲线有不同的颜色和粗细。

26.

27. resources          = True         ; Indicate you want to

28.                                               ; set some resources.


这一行引入了“resources”的概念来改变坐标图的外观。在 NCL,有上百个resources,你可以用来改变线条颜色和粗细,添加标题、改变字体、创建标签和图例、改变地图投影、改变坐标图大小、屏蔽某些区域等等。同样还有一些resources 可以用来改变坐标图的数据,例如设置最小值、最大值,选择数据的子集,或者设置缺失值等。大多数 resources 有默认值,当你运行 NCL 脚本的时候通过 NCL 自动设置的。例如,曲线的粗细的 hard-coded 值是 1.0,但是一条曲线的最大和最小值是根据 XY 坐标图中用到的最大值和最小值自动设置的。如果你想要改变默认值的话,你只有设置一个 resourceResources 通过他们的图形对象的类型或者表述的数据类型进行分类,这些分组在这里或其他示例中讲进行讨论。gsn_*组别的函数设置 resources,首先定义逻辑类型的变量并将其值设为True,然后制定这个逻辑变量的 resources。如上所述,个变量可以有无数个属性。你创建的这个属性需要通过为 resources 设置适当的 gsn_*plotting routine使其有效。重要说明:这一设置 resources 的方法是针对 gsn_*组别的函数和程序的。使straight NCL 代码设置 resources 是完全不同的,在“Going beyond the basics一节中有介绍。

29

30.     resources@xyLineColors      = (/2,3,4/) ; Define line colors.

设置 xyLineColors resources,为每条线定义不同的颜色。默认值是 1,这是前景色(此处是白色)。这里制定的颜色是通过整数 index 值来表示的,每个index 在预先定义的颜色表中对应一个颜色(通常也成为颜色图)。因为在这个示例中没有定义颜色表,因此 NCL 提供了默认的有 32 index 的颜色涂(后面的示例将会展示如何创建自己的颜色图)。要看这个默认的颜色表,参见 NCAR Graphics Reference Manual 的“Clor tables”一节。在默认的颜色表中,整数 234 分别代表红色、绿色和蓝色。

颜色 resources 也可以用命名的颜色来设置,因此 xyLineColors resources 可以用以下代码来设置:

resources@xyLineColors = (/"red","green","blue"/)

在示例 4 7 中将有更详细的命名的颜色。

如果你想要每条曲线的颜色一样,但希望不是“1”,那么你可以使用单数resourcexyLineColor

XY 坐标图 resources 于“XyPlot”组,以“xy”开头。每个 Xy 组的 resource在描述中都要说明类型和默认值。

31. resources@xyLineThicknesses = (/1.,2.,5./) ; Define line thicknesses

32. ;                               (1.0 is the default).

使用 xyLineThicknesses resource,为每条曲线定义不同的粗细,默认的粗细1,所以 2 是默认粗细的 2 倍,5 5 倍,以此类推。同样,你可以使用单数resource xyLineThicknessF,将所有曲线的粗细设为一样。

33.

34. plot = gsn_xy(wks,x,y2,resources)        ;   Draw an XY plot.

绘制坐标图,此时使用刚刚创建的 resources 列表。每条曲线有不同的颜色和不同的粗细。

35.

36. ;---------- Begin fourth plot ------------------------------------------

创建和前面一样的坐标图,只是在顶部添加了标题、改变了 XY 轴的标签、改变了标题和标签的子集,使用标记和/或线来绘制每条曲线。

因为是在绘制和前面一样的坐标图,希望保持和以前 XY 坐标图一样的resources。你只需为 resources 变量添加更多的属性。

如果你想在创建下一个 XY 坐标图之前回到所有的默认值,你可以使用为resources 使用一个新的变量名称,或者用 delete(resources)命令删除当前 resources列表,并且创建一个新的列表。

37.

38. resources@tiMainString = "X-Y plot" ; Title for the XY plot

39. resources@tiXAxisString = "X Axis" ; Label for the X axis

40. resources@tiYAxisString = "Y Axis" ; Label for the Y axis

为在坐标图顶部添加标题、改变 X/Y 轴的标签设置一些 resourcesTitle resources 属于“Title”组,以“ti”开头。

41. resources@tiMainFont = "Helvetica" ; Font for title

42. resources@tiXAxisFont = "Helvetica" ; Font for X axis label

43. resources@tiYAxisFont = "Helvetica" ; Font for Y axis label 

为改变刚刚定义的标题的字体设置一些 resources。可以使用一个描述字体的字符串来设置字体,也可以使用字体表里的 index。有所有可用字体的名字和index 值的表在 NCAR Graphics Reference Manual 的“Font table”可见。

请注意,预先定义的字符串,像在字体表里列出的,是不区分大小写的。你可以用“Helvetica”或者“HELVETICA”或者其他任何大写、小写的组合来指定字体的颜色。

44.

45. resources@xyMarkLineModes = (/"Lines","Markers","MarkLines"/)

46. resources@xyMarkers = (/0,1,3/) ; (none, dot, asterisk)

使用 xyMarkLineModes resource 为曲线添加标记(因为默认的情况是不带标记绘制所有的曲线)。将要绘制三种不同类型的曲线:常规线(“Lines”)、只有标记(“Markers”),带有标记的线(“MarkLines”)。在这个坐标图中,使用 resource来调用三种类型的曲线。XyMarker resource 定义了想要使用的 markers 的类型,共有 17 种标记的类型可供选择。

47. resources@xyMarkerColor = 3 ; Marker color

48. resources@xyMarkerSizeF = 0.03 ; Marker size (default 

49. ; is 0.01)

使用单数 resources xyMarkerColor xyMarkerSizeF,而不是复数的xyMarkerColors xyMarkerSizes,所有带有标记的曲线都会有相同颜色和大小的标记。标记默认的大小是 0.01,所以 0.03 是默认值大小的 3 倍。

50

51. plot = gsn_xy(wks,x,y2,resources) ; Draw an XY plot.

用新设置的 resources 绘制坐标图。

52.

53. ;---------- Begin fifth plot ------------------------------------------

ASCII 文件读取数据,为标题、曲线颜色和标记线设置一些 resources然后创建有两条曲线的 XY 坐标图。

54.

55. filename = "$NCARG_ROOT/lib/ncarg/data/asc/xy.asc"

56.

57. data = asciiread(filename,(/129,4/),"float")

使用 NCL 函数 asciiread 来读取 ASCII 文件。NCARG_ROOT 是环境变量(运行这些 NCL 脚本必须设置),在这个名字之前加上前缀“$”,便可以在文件路径名中使用这个环境变量了。

Asciiread 的第一个参数是文件的名字,第二个参数(1 1 维整型数组)是要读入的数据的维数,第三个单数(一个字符串)是数据的类型。在此,ASCII数据文件的数据有 4 列,每列有 129 行,因此(/129,4/)的维度读入数据。

58.

59. uv = new((/2,129/),float)

60. uv(0,:) = data(:,1)

61. uv(1,:) = data(:,2)

创建 1 个二维数组(2×129)并且给它赋值。符号“(:,1)”表明数据中的第二套 129 个值(记住,NCL 数组是从 index0 开始,不是 index1)。如果你想选择第一套的 129 个值中的第 50-100 个元素,你可以使用符号“(49:99,0)”。

62.

63. lon = data(:,0)64. lon = (lon-1) * 360./128.

将数据的第一套 129 个值赋给变量 lon。因为变量 lon 中的数值范围是从 1.0129.0,但是实际上应该代表的经度值以 360/128 的间隔从 0.0 360.0 的,因此需要进行数值的转换,每个值减去 1,在乘以 360/128。在 NCL 中,如果是标量值可以用相同的符号对整个数组进行标量计算。你可以在一步中进行数组的乘、除、加、减,只要它们对于这样的数组计算有合适的大小。

63-64 行可以合并成一行:

lon = (data(:,0)-1) * 360./128

65.

66. delete(resources) ; Start with new list of resources.

67.

68. resources = True

假设你不想使用前面坐标图设置的 resources,你可以通过删除命令,开始一个新的 resources 模块。如果打算设置一些新的 resources,变量 resources 需要再被设为 True,因为 delete 已经删除了与其有关的任何信息。当然你也可以使用另一个变量名字。

69.

70. resources@tiMainString = "U/V components of wind"

71. resources@tiXAxisString = "longitude"

72. resources@tiYAxisString = "m/s"

73. resources@tiXAxisFontHeightF = 0.02 ; Change the font size.

74. resources@tiYAxisFontHeightF = 0.02

为坐标图的标题、X/Y 轴的标签、修改 X/Y 轴标签的字体大小设置一些

resources

75.

76. resources@xyLineColors = (/3,4/) ; Set the line colors.

77. resources@xyLineThicknessF = 2.0 ; Double the width.

78.

79. resources@xyLabelMode = "Custom" ; Label XY curves.

80. resources@xyExplicitLabels = (/"U","V"/) ; Labels for curves

81. resources@xyLineLabelFontHeightF = 0.02 ; Font size and color

82. resources@xyLineLabelFontColor = 2 ; for line labels

为定义曲线颜色粗细和创建曲线标签设置一些 resources。设置 xyLabelMode为“Custom”,表示你想要自定义 XY 坐标图曲线的标签(默认情况下是没有标签的)。你可以用 xyExplicitLabels resource 来指明你要用的标签。这里使用的XyLineLabel* resources,是用来改变曲线标签的字体大小和颜色。

83.

84. plot = gsn_xy(wks,lon,uv,resources) ; Draw an XY plot with 2 curves.

用刚创建的 resources 列表绘制 XY 坐标图。

85.

86. delete(plot) ; Clean up.

87. delete(resources)

使用 delete 命令删除这个 NCL脚本中创建的变量。在这个示例中并不必要,因为已经在 NCL 脚本的末尾了,但是对于养成删除不再需要的变量的习惯来讲,是一个好主意。

88. end

每个 NCL 脚本都以 end 结束



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存